use [gd1c2011]
/*
CREATE TABLE LAG.mov_stock(
	idMovStock int IDENTITY(1,1) NOT NULL,
	fecha datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
	idSucursal int NOT NULL FOREIGN KEY REFERENCES LAG.sucursales(idSucursal),
	tipoMov nchar(1)  NOT NULL,
	nroFactura int NULL FOREIGN KEY REFERENCES LAG.facturas(nroFactura),
	idAuditor int NULL FOREIGN KEY REFERENCES LAG.usuarios(idUsuario),
	item int NOT NULL,
	idProducto int NOT NULL FOREIGN KEY REFERENCES LAG.productos(idProducto),
	cantidad int NOT NULL
) ;
*/

IF OBJECT_ID ('LAG.tr_insert_mov_stock','TR') IS NOT NULL
    DROP TRIGGER LAG.tr_insert_mov_stock ;
GO
CREATE TRIGGER LAG.tr_insert_mov_stock
	ON LAG.mov_stock AFTER INSERT
AS
BEGIN
	DECLARE @fecha datetime , @idSucursal int , @tipoMov nchar(1) , @idProducto int , @cantidad int ;
	DECLARE @stock int ;
	DECLARE @flg_not_exist_stock int ;
	SELECT @fecha=fecha , @idSucursal=idSucursal , @tipoMov=tipoMov , @idProducto=idProducto , @cantidad=cantidad FROM inserted ;
	set @flg_not_exist_stock = 0 ;
	-- ========================
	-- ACTUALIZACION DE STOCK --
	if not exists ( select * from LAG.stock where idProducto = @idProducto and idSucursal = @idSucursal ) 
	begin
		set @flg_not_exist_stock = 1 ;
		set @stock = 0 ;
		if( @tipoMov = 'I' )
		begin
			-- ingreso al stock
			insert into LAG.stock( idSucursal, idProducto, stock ) values ( @idSucursal, @idProducto, @cantidad ) ;
		end
		-- ELSE: OJO se quiere facturar un producto que no existe en stock , esto debe ser limitado por el programa de facturacion.
	end
	else
	begin
		-- stock: el registro con el producto y sucursal ya existe ; 
		set @flg_not_exist_stock = 0 ;
		set @stock = ( select stock from LAG.stock where idProducto = @idProducto and idSucursal = @idSucursal ) 
		-- VERIFICACION QUE NO QUEDE NEGATIVO: desde la SP de facturacion.
		if( ( @stock + @cantidad ) >= 0 )
		begin
			update LAG.stock set stock = stock + @cantidad where idProducto = @idProducto and idSucursal = @idSucursal
		end
		-- ELSE: intento que el stock quede negativo, nunca deberia cumplirse el ELSE , la verificacion debe estar en el SP de facturacion.
	end
	-- ========================
	-- ACTUALIZACION DE STOCK 0 --
	if( @flg_not_exist_stock = 0 )
	begin
		-- analizamos stock de articulos que tenian un registro previo en stock 
		if( @stock = 0 AND @cantidad > 0 )
		begin
			-- ingresaron articulos cuando el stock estaba en 0
			-- 1. buscamos al producto de la sucursal qeu tenga fechaFin = NULL
			-- 2. hacemos un update de esa fecha a toda()
			update LAG.stock_cero set fechaFin = @fecha  where idProducto = @idProducto and idSucursal = @idSucursal and fechaFin is NULL
		end
		if( @stock > 0 AND ( @stock + @cantidad ) = 0 )
		begin
			-- habia articulos en stock , pero al egresar nos quedamos con stock 0
			insert LAG.stock_cero( idSucursal , idProducto , fechaInicial , fechaFin ) 
				values( @idSucursal , @idProducto , @fecha , NULL ) ;
		end
	end
END
GO


/*
DELETE FROM [GD1C2011].[LAG].[stock_cero] WHERE 1=1 ; 
DELETE FROM [GD1C2011].[LAG].[mov_stock]  WHERE year(fecha) = 2011		
*/

/*			
declare @i int
declare @idSucursal int
declare @idProducto int
set @idSucursal = 17
set @idProducto = 1248681691

set @i = ( select stock from LAG.stock where idSucursal = @idSucursal and idProducto = @idProducto )
print 'stock='+cast(@i as varchar) ;
--select * from LAG.stock_cero where idSucursal = @idSucursal and idProducto = @idProducto ;

print 'simulamos una factura que nos vacia el stock'
INSERT INTO LAG.mov_stock( idSucursal , tipoMov , nroFactura , idAuditor , item , idProducto , cantidad )
values( @idSucursal , 'E' , 10 , NULL , 0 , @idProducto , -@i )

set @i = ( select stock from LAG.stock where idSucursal = @idSucursal and idProducto = @idProducto )
print 'stock='+cast(@i as varchar) ;
select * from LAG.stock_cero where idSucursal = @idSucursal and idProducto = @idProducto ;

select * from LAG.mov_stock where idSucursal = @idSucursal and idProducto = @idProducto and year(fecha) = 2011;
go

*/

/*

print 'simulamos una factura que nos vacia el stock'
declare @i int
set @i = ( select stock from LAG.stock where idSucursal = 17 and idProducto = 1248681691 )
print 'stock='+cast(@i as varchar) ;
INSERT INTO LAG.mov_stock( idSucursal , tipoMov , nroFactura , idAuditor , item , idProducto , cantidad )
values( 17 , 'E' , 10 , NULL , 0 , 1248681691 , -@i )


print 'simulamos una asignacion de stock '
INSERT INTO LAG.mov_stock( idSucursal , tipoMov , nroFactura , idAuditor , item , idProducto , cantidad )
values( 17 , 'I' , NULL , 2 , 0 , 1248681691 , +10 )


select * from LAG.stock_cero 
select * from LAG.stock where idSucursal = 17 and idProducto = 1248681691
select * from LAG.mov_stock where idSucursal = 17 and idProducto = 1248681691 and year(fecha) = 2011;


--intentamos bajar 100 unidades el stock a ver si queda negativo
INSERT INTO LAG.mov_stock( idSucursal , tipoMov , nroFactura , idAuditor , item , idProducto , cantidad )
values( 17 , 'E' , 10 , NULL , 0 , 1248681691 , -100 )

INSERT INTO LAG.mov_stock( idSucursal , tipoMov , nroFactura , idAuditor , item , idProducto , cantidad )
values( 17 , 'E' , 10 , NULL , 0 , 1248681691 , 0 )


*/



/*


set @i = ( select stock from LAG.stock where idSucursal = 17 and idProducto = @idProducto )
print 'stock='+cast(@i as varchar) ;
select * from LAG.stock_cero where idSucursal = @idSucursal and idProducto = @idProducto ;

select * from LAG.stock_cero 

*/

/*

-- Procedimiento para 
CREATE PROCEDURE spu_addCliente @nombre varchar(100),

@apellido1 varchar(100),

@apellido2 varchar(100),

@nifCif varchar(20),

@fxNaciento datetime

AS

BEGIN TRY

    BEGIN TRAN

    INSERT INTO CLIENTES

    (nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES

    (@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento)

    COMMIT

END TRY

BEGIN CATCH

    ROLLBACK

    PRINT ERROR_MESSAGE()

END CATCH

*/